package com.xuanyuanxinyu.view.adapter

import androidx.recyclerview.widget.DiffUtil

/**
 * 用于比较两元素的差异
 */
class DiffItemCallback : DiffUtil.ItemCallback<User>() {
    /**
     * 检测两项是否是同一项
     */
    override fun areItemsTheSame(oldItem : User, newItem : User) : Boolean {
        // Id is unique.
        return oldItem.id == newItem.id
    }
    
    /**
     * 检测两项是否有相同的数据
     */
    override fun areContentsTheSame(oldItem : User, newItem : User) : Boolean {
        return oldItem == newItem
    }
    
    /**
     * 当areItemsSame（T，T）为两个项返回true，areContentsSame（T，T）为它们返回false时，调用此方法以获取有关更改的有效负载。
     * 例如，如果将DiffUtil与RecyclerView一起使用，则可以返回项目中更改的特定字段，ItemAnimator可以使用该信息运行正确的动画。默认实现返回null。
     *
     * 即同一项内容中的某个字段有更新改动
     */
    override fun getChangePayload(oldItem : User, newItem : User) : Any? {
        return super.getChangePayload(oldItem,newItem)
    }
}


class DiffCallback(private val mOldList : List<User>, private val mNewList : List<User>) : DiffUtil.Callback() {
    override fun getOldListSize() : Int {
        // 返回旧数据的长度
        return mOldList.size
    }
    
    override fun getNewListSize() : Int {
        // 返回新数据的长度
        return mNewList.size
    }
    
    override fun areItemsTheSame(oldItemPosition : Int,newItemPosition : Int) : Boolean {
        // 返回两个item是否相同
        // 例如：此处两个item的数据实体是User类，所以以id作为两个item是否相同的依据
        // 即此处返回两个user的id是否相同
        return mOldList[oldItemPosition].id == mNewList[newItemPosition].id
    }
    
    override fun areContentsTheSame(oldItemPosition : Int,newItemPosition : Int) : Boolean {
        // 当areItemsTheSame返回true时，我们还需要判断两个item的内容是否相同
        // 此处以User的age作为两个item内容是否相同的依据
        // 即返回两个user的age是否相同
        return mOldList[oldItemPosition].name == (mNewList[newItemPosition]).name
    }
}

